//@+leo-ver=5-thin
//@+node:sonam.20180318222402.1: * @file SunMoonTab.pas
//@+at
// 該單元實現了月離步數表和日躔步數表的查表函數
// 
//@@c
unit SunMoonTab;

//@+others
//@+node:sonam.20180328094616.1: ** Interface
interface
    function GetMoonMultiplier(step : Integer) : Integer;
    function GetMoonAccum(step : Integer) : Integer;
    function GetSunMultiplier(step : Integer) : Integer;
    function GetSunAccum(step : Integer) : Integer;
//@+node:sonam.20180328094800.1: ** Implementation
implementation
//@+node:sonam.20180328094856.1: *3* 類型聲明
Type
    IntTab14 = array [0..13] of Integer;
    IntTab6 = array [0..5] of Integer;
//@+node:sonam.20180318220223.1: *3* 月離步數表
//@+at 月離步數表是用來刻畫月亮運行遲速變化的，一個近點月大約是二十八天，月離表刻畫其中的半個週期，另外半個週期與此對稱。月離表的第一列是檢步序數，第二列叫作損益率，即諸曜從遠地點(或近日點)開始每行一步，相對於平均速度而言，超過或不及的度數，單位是弧刻。月亮的運行速度在五十四和六十四弧刻之間變化，所以與平均行度之差最大爲五。第三列叫作盈縮積，是從遠地點開始到某曜所在的宮(宿)之間，各步的損益率纍積之和。
// 
//@@c
function GetMoonMultiplier(step : Integer) : Integer;
Const
    MoonMultiplierTab : IntTab14 =
        ( -5, 5, 5, 5, 4, 3, 2, 1, -1, -2, -3, -4, -5, -5 );
Var
    i : Integer;
begin
    if step = 13 then
        i := 0
    else
        i := step+1;
    result := MoonMultiplierTab[i];
end;

function GetMoonAccum(step : Integer) : Integer;
Const
    MoonAccumTab : IntTab14 = 
        ( 0, 5, 10, 15, 19, 22, 24, 25, 24, 22, 19, 15, 10, 5 );
begin
    result := MoonAccumTab[step];
end;
//@+node:sonam.20180318220710.1: *3* 日躔步數表
//@+at 日躔步數表是用來刻畫太陽運行遲速變化的，太陽運行一週要經過黃道十二宮，日躔表刻畫其中的半個週期，另外半個週期與此對稱。日躔表的第一列是引檢步數，第二列叫作損益率，第三列叫作盈縮積，是從遠地點開始到某曜所在的宮(宿)之間，各步的損益率纍積之和。
// 
//@@c
function GetSunMultiplier(step : Integer) : Integer;
Const
    SunMultiplierTab : IntTab6 =
        ( -6, 6, 4, 1, -1, -4 );
Var
    i : Integer;
begin
    if step = 6-1 then
        i := 0
    else
        i := step+1;
    result := SunMultiplierTab[i];
end;

function GetSunAccum(step : Integer) : Integer;
Const
    SunAccumTab : IntTab6 = 
        ( 0, 6, 10, 11, 10, 6 );
begin
    result := SunAccumTab[step];
end;
//@-others

end.
//@-leo
